package cn.tedu.st.base.handler;

import cn.tedu.st.base.result.JsonResult;
import cn.tedu.st.base.result.ResultCode;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 *  实现了accessDeniedHandler
 * 处理已认证用户访问无权限资源的异常（对应HTTP 403）。
 * 例如：普通用户尝试访问管理员接口。
 * 已登录用户访问无权限接口
 */
@Component
@Slf4j
public class CustomerAccessDeniedHandler implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException {
        log.debug("进入CustomerAccessDeniedHandler---------");
        log.debug("已登录用户 访问无权限的处理器--->抛了一个异常accessDeniedException={}", accessDeniedException.getMessage());

        // 设置响应内容类型为 JSON，并指定字符编码为 UTF-8
        response.setContentType("application/json;charset=utf-8");

        // 获取响应的输出流，用于写入 JSON 数据
        ServletOutputStream outputStream = response.getOutputStream();

        // 将 JsonResult 对象转换为 JSON 字符串，并禁用循环引用检测
        //无权访问，请联系管理员异常
        String jsonString = JSON.toJSONString(JsonResult.failure(ResultCode.FORBIDDEN), SerializerFeature.DisableCircularReferenceDetect);


        // 将 JSON 字符串写入响应的输出流，并指定字符编码为 UTF-8
        outputStream.write(jsonString.getBytes(StandardCharsets.UTF_8));
        outputStream.flush();
        outputStream.close();
        log.debug("进入CustomerAccessDeniedHandler执行结束-------");
    }
}
